MCS-51

Tutorials

EX-F320

LED Timer
Serial

C8051F340/380

LED Timer
Serial

C8051F V2.1 (F020)

LED Timer
Serial

C8051F300 Dev. B. Mod.

LED Timer
Serial

C8051F V2.1 (F120)

LED Timer
Serial
Benchmarks

51 MCU SCM

Serial

STC89 DEMO BOARD

LED Timer
Serial

EZ-USB FX2LP

LED Timer
Serial
Benchmarks

colecovision.eu

ColecoVision

STM8

MCS-51

LLVM+SDCC

Contact

Getting started with MCS-51 development using free software: Dhrystone on the EZ-USB FX2LP

This short tutorial shows how to compile the Dhrystone benchmark and execute it on an CY7C68013A EZ-USB FX2LP USB2.0 Development Board with an extra RS232 board for serial communication. The author used a Debian GNU/Linux system, but the tutorial should work for other Linux distributions, *BSD or other Unices.

The tools we use are

Hardware setup

CY7C68013A EZ-USB FX2LP USB2.0 Development Board with RS232 board

The CY7C68013A EZ-USB FX2LP USB2.0 Development Board is connected to the host computer via a USB cable for power and to write the demo onto the board. We connect the RS232 board to the PA0 header for data and to the power header for power (VCC to +5V, GND to GND); the serial cable is then attached to the RS232 board. On the other end the serial cable is attached to an RS232 port on a computer running a terminal program configured for 1200 baud, no parity, 8 bits, 1 stop bit and no flow control. We used a USB-to-serial converter and gtkterm.

Get SDCC

Depending on your operating system there might be an easy way to install SDCC 3.5.0 or newer using a package system or similar (e.g. apt-get install sdcc on Debian). While SDCC 3.4.0 should be sufficient for this tutorial, you might want to try a newer version in case you encounter any bugs.

SDCC binaries or a source tarball can be downloaded from its website.

Get cycfx2prog

Depending on your operating system there might be an easy way to install cycfx2prog using a package system or similar (e.g. apt-get install sdcc on Debian).

A source tarball can be downloaded from its website.

Get Dhrystone

Download a version of Dhrystone adapted for use with SDCC and the EZ-USB FX2LP board.
Download, and unpack it using tar -xzf dhrystone-cy7c68013a-softuartpa0-sdcc-3.6.0.tar.gz, change into the directory dhrystone-cy7c68013a-softuartpa0-sdcc-3.6.0.
You can then compile dhrystone by typing make. In the end there should be a file dhrystone.ihx.

A bit of custom code was necessary to make Dhrystone run using SDCC on the board. See the file dhry.h and portme.c for details. The file portme.c basically combines clock() from the timer demo and putchar() from the serial demo. Since we are running a benchmark, and want good results, we also run the CPU at the full 48 Mhz (instead of the default 12 Mhz the other tutorials use).

Put Dhrystone onto the board

Assuming the board is attached via USB, cycfx2prog prg:dhrystone.ihx run will write Dhrystone onto the board. Dhrystone will run and report its results. You can see them by attaching a serial cable to the DB9 connector on the RS232 board, and using a terminal program configured for 1200 baud, no parity, 8 bits, 1 stop bit and no flow control. They should look like this (the benchmark numbers may vary depending on the SDCC version used to compile Dhrystone):

Dhrystone Benchmark, Version 2.1 (Language: C)

Program compiled with 'register' attribute

Please give the number of runs through the benchmark: 
Execution starts, 20000 runs through Dhrystone
Execution ends

Final values of the variables used in the benchmark:

Int_Glob:            5
        should be:   5
Bool_Glob:           1
        should be:   1
Ch_1_Glob:          A
        should be:   A
Ch_2_Glob:           B
        should be:   B
Arr_1_Glob[8]:       7
        should be:   7
Arr_2_Glob[8][7]:    20010
        should be:   Number_Of_Runs + 10
Ptr_Glob->
  Ptr_Comp:          15884
        should be:   (implementation-dependent)
  Discr:             0
        should be:   0
  Enum_Comp:         2
        should be:   2
  Int_Comp:          17
        should be:   17
  Str_Comp:          DHRYSTONE PROGRAM, SOME STRING
        should be:   DHRYSTONE PROGRAM, SOME STRING
Next_Ptr_Glob-
  Ptr_Comp:          15884
        should be:   (implementation-dependent), same as above
  Discr:             0
        should be:   0
  Enum_Comp:         1
        should be:   1
  Int_Comp:          18
        should be:   18
  Str_Comp:          DHRYSTONE PROGRAM, SOME STRING
        should be:   DHRYSTONE PROGRAM, SOME STRING
Int_1_Loc:           5
        should be:   5
Int_2_Loc:           13
        should be:   13
Int_3_Loc:           7
        should be:   7
Enum_Loc:            1
        should be:   1
St_1_Loc:           DHRYSTONE PROGRAM, 1'ST STRING
        should be:   DHRYSTONE PROGRAM, 1'ST STRING
Str_2_Loc:           DHRYSTONE PROGRAM, 2'ND STRING
        should be:   DHRYSTONE PROGRAM, 2'ND STRING

Microseconds for one run through Dhrystone: 1252 
Dhrystones per Second:                      798

More about cycfx2prog

cycfx2prog was written by Wolfgang Wieser. It is a tool to program the FX2 (i.e. to download '8051 firmware into the RAM) and do basic endpoint communication for testing purposes. cycfx2prog requires the input file to be an .ihx Intel hex file.

More about SDCC

SDCC was initially written by Sandeep Dutta for the MCS-51, and has a relatively conservative architecture (see Sandeep Dutta, "Anatomy of a Compiler", 2000). It has been extended by various contributors and more recently, incorporated some cutting-edge technologies, in particular in register allocation (see Philipp Klaus Krause, "Optimal Register Allocation in Polynomial Time", 2013 and "Bytewise Register Allocation", 2015). However the mcs51 backend does not have all the fancy features and optimizations that some newer backends have.

SDCC is a C compiler that aims to be compliant with the C standards.

Important compiler options for MCS-51 developers include: